#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
int n,m,s,t;
int u,v,w;
const int N=1e3+50;
const ll INF=0xffffffff;
ll g[N][N];
ll low[N];
bool vis[N];
ll Dijkstra(int s,int t){
    for(int i=1;i<=n;i++){
        low[i]=g[s][i];
        vis[i]=false;
    }
    low[s]=0;
    vis[s]=true;
    for(int i=1;i<n;i++){
        int k=-1;
        ll Min=INF;
        for(int j=1;j<=n;j++){
            if(!vis[j] && low[j]<Min){
                Min=low[j];
                k=j;
            }
        }
        if(k==-1){
            break;
        }
        vis[k]=true;
        for(int j=1;j<=n;j++){
            if(!vis[j] && low[k]+g[k][j]<low[j]){
                low[j]=low[k]+g[k][j];
            }
        }
    }
    return low[t];
}
int main(void){ 
    scanf("%d%d%d%d",&n,&m,&s,&t);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            g[i][j]=i==j?0:INF;
        }
    }
    while(m--){
        scanf("%d%d%d",&u,&v,&w);
        //建图注意重边，注意端点顺序
        if(w<g[u][v] || w<g[v][u]){
            g[u][v]=w;
            g[v][u]=w;
        }
    }
    printf("%lld\n",Dijkstra(s,t));
    return 0;
}